#include <iostream>
#include <pthread.h>
#include <cstring>
#include <unistd.h>
using namespace std;
#include "mythread.hpp"
#include "ThreadGuard.hpp"

pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;

void *threadRoutine(void *args)
{
    cout << "I am a new thread " << endl;

    pthread_mutex_lock(&mutex);
    cout << "I got a mutex!" << endl;

    pthread_mutex_lock(&mutex); // 申请锁的问题，它会停下来
    cout << "I alive again" << endl;

    return nullptr;
}

int main()
{
    pthread_t tid;
    pthread_create(&tid, nullptr, threadRoutine, nullptr);

    sleep(3);
    cout << "main thread run begin" << endl;
    pthread_mutex_unlock(&mutex);
    cout << "main thread unlock..." << endl;

    sleep(3);
    return 0;
}

// int ticket = 1000;
// pthread_mutex_t mutex;

// void *run_thread(void *args){
//     //pthread_detach(pthread_self());

//     while(true)
//     {
//         //pthread_mutex_lock(&mutex);
//         LockGuard lockgraud(&mutex);
//         if(ticket)
//         {
//             cout<<"我是"<<(char*)args<<" "<<"还有票数:"<<ticket--<<endl;
//             //pthread_mutex_unlock(&mutex);

//         }else
//         {
//             //pthread_mutex_unlock(&mutex);
//             break;
//         }
//         usleep(1000);

//     }
//     return nullptr;
// }

// int main()
// {
//     Thread t1(1,run_thread,(void*)"thread1");
//     Thread t2(2,run_thread,(void*)"thread2");

//     t1.run();
//     t2.run();

//     t1.join();
//     t2.join();
//     return 0;
// }

// int main(){
//     pthread_t tid[4];
//     for(int i=0;i<4;++i)
//     {
//         char* name = new char[64];
//         snprintf(name,64,"thread-%d",i+1);
//         pthread_create(tid+i,nullptr,run_thread,name);

//     }

//     //sleep(2);
//     for(int i=0;i<4;++i)
//     {
//         int n = pthread_join(tid[i],nullptr);
//         if(n!=0)
//         {
//             cout<<"error:"<<n<<":"<<strerror(n)<<endl;
//         }
//     }

//     return 0;
// }

// void *run_thread1(void *args){
//     while(true)
//     {
//         cout<<"我是执行流1:"<<*((int*)args)<<endl;
//         sleep(1);

//     }
// }
// void *run_thread2(void *args){
//     while(true)
//     {
//         cout<<"我是执行流2:"<<*((int*)args)<<endl;
//         sleep(1);

//     }
// }
// void *run_thread3(void *args){
//     while(true)
//     {
//         cout<<"我是执行流3:"<<*((int*)args)<<endl;
//         sleep(1);
//     }
// }
// int main(){
//     pthread_t t1,t2,t3;
//     int th1=1;
//     pthread_create(&t1,nullptr,run_thread1,&th1);
//     int th2=2;
//     pthread_create(&t2,nullptr,run_thread2,&th2);
//     int th3=3;
//     pthread_create(&t3,nullptr,run_thread3,&th3);

//     while(true)
//     {
//         cout<<"我是主执行流"<<endl;
//         sleep(1);
//     }
//     return 0;
// }

// #define NUM 10
// void *run_thread1(void *args){
//     while(true)
//     {
//         cout<<"我是执行流:"<<(char*)args<<endl;
//         sleep(1);
//     }

//     return nullptr;
// }

// int main()
// {
//     pthread_t tds[NUM];
//     for(int i=0;i<NUM;i++)
//     {
//         //char tname[64]{0};//每次循环进来的时候tname的缓冲区地址是相同的，所以每次创建线程会对缓冲区的内容进行覆盖
//         char* tname = new char[64];
//         sprintf(tname,"thread - %d",i+1);
//         pthread_create(tds+i,nullptr,run_thread1,tname);
//     }

//     while(true);
//     // {
//     //     //cout<<"我是执行流main:"<<endl;
//     //     sleep(1);
//     // }
//     return 0;
// }
